/*
 * @lc app=leetcode.cn id=73 lang=javascript
 *
 * [73] 矩阵置零
 */

// @lc code=start
/**
 * @param {number[][]} matrix
 * @return {void} Do not return anything, modify matrix in-place instead.
 */
// 只使用一个标记变量记录第一列是否原本存在0。
// 这样,第一列的第一个元素即可以标记第一行是否出现0
var setZeroes = function(matrix) {
  let flag = false
  let yl = matrix.length
  let xl = matrix[0].length
  for (let y = 0; y < yl; y++) {
    // 记录第一列本身是否有0
    if (!matrix[y][0]) {
      flag = true
    }
    // 在第一行，第一列上记录该行该列上是否有0
    for (let x = 1; x < xl; x++) {
      if (!matrix[y][x]) {
        matrix[0][x] = matrix[y][0] = 0
      }
    }
  }
  // 倒着遍历，以免第一行都为0后，影响后续的列
  for (let y = yl - 1; y >= 0; y--) {
    for (let x = 1; x < xl; x++) {
      if (!matrix[y][0] || !matrix[0][x]) {
        matrix[y][x] = 0
      }
    }
    if (flag) {
      matrix[y][0] = 0
    }
  }
  return matrix
};
// @lc code=end

// 将第一行和第一列作为，某行某列是否有0的信息存储的xy轴，
// 所以需要两个变量记录本身是否有0
// var setZeroes = function(matrix) {
//   let zeroX = false
//   let zeroY = false
//   let yl = matrix.length
//   let xl = matrix[0].length
//   for (let x = 0; x < xl; x++) {
//     if(!matrix[0][x]) {
//       zeroX = true
//       break
//     }
//   }
//   for (let y = 0; y < yl; y++) {
//     if (!matrix[y][0]) {
//       zeroY = true
//       break
//     }
//   }

//   for (let y = 1; y < yl; y++) {
//     for (let x = 1; x < xl; x++) {
//       if (!matrix[y][x]) {
//         matrix[y][0] = matrix[0][x] = 0
//       }
//     }
//   }

//   for (let y = 1; y < yl; y++) {
//     for (let x = 1; x < xl; x++) {
//       if (!matrix[y][0] || !matrix[0][x]) {
//         matrix[y][x] = 0
//       }
//     }
//   }

//   if (zeroX) {
//     for (let x = 0; x < xl; x++) {
//       matrix[0][x] = 0
//     }
//   }

//   if (zeroY) {
//     for (let y = 0; y < yl; y++) {
//       matrix[y][0] = 0
//     }
//   }
//   return matrix
// }



